home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Games of Daze
/
Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso
/
x2ftp
/
msdos
/
libs
/
knowhow4
/
axe.cpp
< prev
next >
Wrap
C/C++ Source or Header
|
1994-11-19
|
4KB
|
157 lines
#include <stdio.h>
#include <stdlib.h>
#include "axe.h"
#include <mem.h>
#include <math.h>
Axe::Axe(int l, double start, double end, int tick_no, int* t,
int s_tick_no, int* s, char** lab)
{
len_scr = l;
ticks = sub_ticks = NULL;
if(start != end)
{
labels = (char**)malloc(sizeof(char*) * MAXLABELS);
calc_labels(start, end, tick_no, s_tick_no);
if(s_tick_no != 0)
{
if(sub_ticks == NULL)
sub_ticks = new int[s_tick_no + 2];
for(int i = 0; i < s_tick_no; i++)
sub_ticks[i] = s[i];
}
else
{
sub_ticks_no = ticks_no;
if(sub_ticks == NULL)
sub_ticks = new int[ticks_no + 2];
for(int i = 0; i < sub_ticks_no; i++)
sub_ticks[i] = ticks[i];
}
return;
}
sub_ticks_no = s_tick_no;
ticks_no = tick_no;
if(tick_no != 0)
{
ticks = new int[tick_no + 2];
labels = (char**)malloc(sizeof(char*) * tick_no + 2);
for(int i = 0; i < tick_no; i++)
{
ticks[i] = t[i];
labels[i] = strdup(lab[i]);
}
}
if(s_tick_no != 0)
{
if(sub_ticks == NULL)
sub_ticks = new int[s_tick_no + 2];
for(int i = 0; i < s_tick_no; i++)
sub_ticks[i] = s[i];
}
}
///////////////////////////////////
Axe::~Axe()
{
delete ticks;
delete sub_ticks;
for(int i = 0; i < ticks_no; i++)
delete labels[i];
delete labels;
}
///////////////////////////////////
void Axe::draw_axe(loc lt, int ax_col, int lab_col)
{
show_axe(lt, ax_col);
drawTool->setcolor(lab_col);
show_labels(lt);
}
//////////////////////////////////
/*
int Axe::calc_labels(double start, double end, int t, int s)
{
ticks_no = t;
ticks = new int[ticks_no];
char str[80];
for(int i = 0; i < ticks_no; i++)
{
sprintf(str, "%g", start + (end - start) / (ticks_no - 1) * i);
labels[i] = strdup(str);
ticks[i] = 10000 / (ticks_no - 1) * i;
}
sub_ticks_no = s;
sub_ticks = new int[sub_ticks_no];
for(i = 0; i < sub_ticks_no; i++)
sub_ticks[i] = 10000 / (sub_ticks_no - 1) * i;
return ticks_no;
}
*/
///////////////////////////////
int Axe::calc_labels(double start, double end, int /*t*/, int s)
{
double len = pow10((int)log10(end - start));
if((end - start) / len <= 3)
len /= 5;
ticks_no = (end - start) / len + 1;
ticks = new int[ticks_no + 2];
char str[80];
if(end > 0 && start >= 0)
{
int i;
double pos;
for(i = 0, pos = (int)(start / len + 1) * len;
pos <= end && i < ticks_no; i++, pos += len)
{
sprintf(str, "%g", pos);
labels[i] = strdup(str);
ticks[i] = 10000 / ((end - start) / (pos - start));
}
ticks_no = i;
}
else if(end <= 0 && start < 0)
{
int i;
double pos;
for(i = 0, pos = (int)(end / len - 1) * len;
pos >= start && i < ticks_no; i++, pos -= len)
{
sprintf(str, "%g", pos);
labels[i] = strdup(str);
ticks[i] = start == pos
? 0 : 10000.0 / ((end - start) / (pos - start));
}
ticks_no = i;
}
else
{
int i;
double pos;
for(i = 0, pos = 0; pos <= end && i < ticks_no; i++, pos += len)
{
sprintf(str, "%g", pos);
labels[i] = strdup(str);
ticks[i] = 10000 / ((end - start) / (pos - start));
}
for(pos = -len; pos >= start && i < ticks_no; i++, pos -= len)
{
sprintf(str, "%g", pos);
labels[i] = strdup(str);
ticks[i] = start == pos
? 0 : 10000.0 / ((end - start) / (pos - start));
}
ticks_no = i;
}
sub_ticks_no = s;
if(sub_ticks_no != 0)
sub_ticks = new int[sub_ticks_no];
for(int i = 0; i < sub_ticks_no; i++)
sub_ticks[i] = 10000 / (sub_ticks_no - 1) * i;
return ticks_no;
}